package structer

import (
	"fmt"
)

/* 关于内存泄漏造成的空结构体相等的问题 */
// 发生内存逃逸的时候，zerobase是所有0字节分配的基础地址，
// 就是空的——0字节在进行逃逸分析之后，往堆分配都会指向这个地址（注意，空结构体才会）
// 并且，没有发生逃逸的空结构体，比较是不相等的，GO团队特意为之，和map无序一样。

type User struct {
	Name string
}

type People struct{}

func StructDemo1() {
	println("Demo1")
	a := &User{}
	b := &User{}

	println(a)
	println(b)
	println(a == b)
	// 输出的是什么？
}

func StructDemo2() {
	fmt.Println("Demo2")
	a := &User{}
	b := &User{}

	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(a == b)
}

func StructDemo3() {
	fmt.Println("Demo3")
	a := &User{}
	b := &User{}

	fmt.Printf("%p\n", a)
	fmt.Printf("%p\n", b)
	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(a == b)
}

func StructDemo4() {
	println("Demo4")
	a := &User{}
	b := &User{}

	print("%p\n", a)
	print("%p\n", b)
	print(a == b)
}

func resDemo() {
	a := &User{}
	b := &User{}

	println(a, b, a == b)
	fmt.Println(a, b, a == b)
}

func exampleDemo() {
	a := new(struct{})
	b := new(struct{})
	println(a, b, a == b)

	c := new(struct{})
	d := new(struct{})
	fmt.Println(c, d)
	println(c, d, c == d)
	// 0xc000059f2f 0xc000059f2f false
	// &{} &{}
	// 0xca4aa0 0xca4aa0 true
	// PASS
}

func exampleDemo1() {
	a := new(User)
	b := new(User)
	println(a, b, a == b)

	c := new(User)
	d := new(User)
	fmt.Println(c, d)
	println(c, d, c == d)
	// 0xc000059f2f 0xc000059f2f false
	// &{} &{}
	// 0xca4aa0 0xca4aa0 true
	// PASS
}
